home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Light ROM 1
/
LIGHT-ROM 1 (Amiga Library Services)(1994).iso
/
ffdisks
/
d882.lha
/
GALer
/
GALer_english
/
Source
/
GALerSrcE.lha
/
Reasm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-26
|
36KB
|
1,238 lines
/****************************************************************/
/* */
/* Reasm.c -- enthält den Reassembler, der aus der Jedec-Datei */
/* wieder ein Source-File (.pld) erstellt. */
/* */
/* compilieren: cc Reasm.c */
/* */
/****************************************************************/
#include <exec/memory.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <ctype.h>
#include <functions.h>
#include "GALer.h"
extern char path[];
extern int JedecGALType;
extern char filename[]; /*Puffer für Filenamen*/
extern struct JedecStruct Jedec;
extern struct Window *window;
int FuseToPin16Mode1[] = { 2,1,3,19,4,18,5,17,6,14,7,13,8,12,9,11 };
int FuseToPin16Mode2[] = { 2,1,3,18,4,17,5,16,6,15,7,14,8,13,9,11 };
int FuseToPin16Mode3[] = { 2,19,3,18,4,17,5,16,6,15,7,14,8,13,9,12 };
int FuseToPin20Mode1[] = { 2,1,3,23,4,22,5,21,6,20,7,17,8,16,9,15,10,14,11,13 };
int FuseToPin20Mode2[] = { 2,1,3,23,4,21,5,20,6,19,7,18,8,17,9,16,10,14,11,13 };
int FuseToPin20Mode3[] = { 2,23,3,22,4,21,5,20,6,19,7,18,8,17,9,16,10,15,11,14 };
SHORT RBorderVec1a[] = { 0,14,77,14,77,0 };
SHORT RBorderVec1b[] = { 0,14,0,0,77,0 };
SHORT RBorderVec2a[] = { 0,9,83,9,83,0 };
SHORT RBorderVec2b[] = { 0,9,0,0,83,0 };
SHORT RBorderVec3a[] = { 0,11,51,11,51,0 };
SHORT RBorderVec3b[] = { 0,11,0,0,51,0 };
SHORT PinNameBorVeca[] = { 0,179,309,179,309,0 };
SHORT PinNameBorVecb[] = { 0,179,0,0,309,0 };
struct Border RBorder1b = { -1,-1,2,0,JAM1,3,RBorderVec1b,NULL };
struct Border RBorder1a = { -1,-1,1,0,JAM1,3,RBorderVec1a,&RBorder1b };
struct Border RBorder2b = { -1,-1,2,0,JAM1,3,RBorderVec2b,NULL };
struct Border RBorder2a = { -1,-1,1,0,JAM1,3,RBorderVec2a,&RBorder2b };
struct Border RBorder3b = { -1,-1,2,0,JAM1,3,RBorderVec3b,NULL };
struct Border RBorder3a = { -1,-1,1,0,JAM1,3,RBorderVec3a,&RBorder3b };
struct Border PinNameBorderb = { 0,0,2,0,JAM1,3,PinNameBorVecb,NULL };
struct Border PinNameBordera = { 0,0,1,0,JAM1,3,PinNameBorVeca,&PinNameBorderb};
struct IntuiText RIText27 = { 1,0,JAM1,10,7,NULL,(UBYTE *)"Pinnames:",NULL };
struct IntuiText RIText26 = { 1,0,JAM1,10,3,NULL,(UBYTE *)"Cancel",NULL };
struct IntuiText RIText25 = { 1,0,JAM1,15,3,NULL,(UBYTE *)" Cont",NULL };
struct IntuiText RIText30 = { 1,0,JAM1,5,1,NULL,(UBYTE *)" Set",NULL };
struct IntuiText RIText31 = { 1,0,JAM1,5,1,NULL,(UBYTE *)"Clear",NULL };
struct IntuiText RIText29 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"12",NULL };
struct IntuiText RIText28 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"11",NULL };
struct IntuiText RIText24 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"24",NULL };
struct IntuiText RIText23 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"23",NULL };
struct IntuiText RIText22 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"22",NULL };
struct IntuiText RIText21 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"21",NULL };
struct IntuiText RIText20 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"20",NULL };
struct IntuiText RIText19 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"19",NULL };
struct IntuiText RIText18 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"18",NULL };
struct IntuiText RIText17 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"17",NULL };
struct IntuiText RIText16 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"16",NULL };
struct IntuiText RIText15 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"15",NULL };
struct IntuiText RIText14 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"14",NULL };
struct IntuiText RIText13 = { 1,0,JAM1,-22,0,NULL,(UBYTE *)"13",NULL };
struct IntuiText RIText12 = { 1,0,JAM1, 89,0,NULL,(UBYTE *)"12",NULL };
struct IntuiText RIText11 = { 1,0,JAM1, 89,0,NULL,(UBYTE *)"11",NULL };
struct IntuiText RIText10 = { 1,0,JAM1, 89,0,NULL,(UBYTE *)"10",NULL };
struct IntuiText RIText9 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"9", NULL };
struct IntuiText RIText8 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"8", NULL };
struct IntuiText RIText7 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"7", NULL };
struct IntuiText RIText6 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"6", NULL };
struct IntuiText RIText5 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"5", NULL };
struct IntuiText RIText4 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"4", NULL };
struct IntuiText RIText3 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"3", NULL };
struct IntuiText RIText2 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"2", NULL };
struct IntuiText RIText1 = { 1,0,JAM1, 97,0,NULL,(UBYTE *)"1", NULL };
UBYTE PinNames16[20][10] = { "A","B","C","D","E","F","G","H","I","GND",
"J","K","L","M","N","O","P","Q","R","VCC" };
UBYTE PinNames20[24][10] = { "A","B","C","D","E","F","G","H","I","J","K","GND",
"L","M","N","O","P","Q","R","S","T","U","V","VCC" };
struct StringInfo R16Gad24SInfo = { PinNames16[23],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad23SInfo = { PinNames16[22],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad22SInfo = { PinNames16[21],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad21SInfo = { PinNames16[20],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad20SInfo = { PinNames16[19],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad19SInfo = { PinNames16[18],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad18SInfo = { PinNames16[17],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad17SInfo = { PinNames16[16],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad16SInfo = { PinNames16[15],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad15SInfo = { PinNames16[14],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad14SInfo = { PinNames16[13],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad13SInfo = { PinNames16[12],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad12SInfo = { PinNames16[11],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad11SInfo = { PinNames16[10],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad10SInfo = { PinNames16[9],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad9SInfo = { PinNames16[8],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad8SInfo = { PinNames16[7],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad7SInfo = { PinNames16[6],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad6SInfo = { PinNames16[5],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad5SInfo = { PinNames16[4],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad4SInfo = { PinNames16[3],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad3SInfo = { PinNames16[2],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad2SInfo = { PinNames16[1],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R16Gad1SInfo = { PinNames16[0],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad24SInfo = { PinNames20[23],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad23SInfo = { PinNames20[22],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad22SInfo = { PinNames20[21],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad21SInfo = { PinNames20[20],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad20SInfo = { PinNames20[19],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad19SInfo = { PinNames20[18],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad18SInfo = { PinNames20[17],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad17SInfo = { PinNames20[16],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad16SInfo = { PinNames20[15],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad15SInfo = { PinNames20[14],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad14SInfo = { PinNames20[13],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad13SInfo = { PinNames20[12],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad12SInfo = { PinNames20[11],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad11SInfo = { PinNames20[10],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad10SInfo = { PinNames20[9],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad9SInfo = { PinNames20[8],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad8SInfo = { PinNames20[7],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad7SInfo = { PinNames20[6],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad6SInfo = { PinNames20[5],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad5SInfo = { PinNames20[4],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad4SInfo = { PinNames20[3],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad3SInfo = { PinNames20[2],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad2SInfo = { PinNames20[1],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
struct StringInfo R20Gad1SInfo = { PinNames20[0],NULL,0,10,0,
0,0,0,0,0,0,0,NULL };
/*ACHTUNG: zwischen R16/20Gad1 und R16/20Gad24 dürfen keine neuen Gadgets
hinzugefügt werden und an R16/20Gad24 keine angehängt werden!
*/
struct Gadget R16Gad20 = { NULL,192,21,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText20,NULL,
(APTR)&R16Gad20SInfo,20,NULL };
struct Gadget R16Gad19 = { &R16Gad20,192,32,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText19,NULL,
(APTR)&R16Gad19SInfo,19,NULL };
struct Gadget R16Gad18 = { &R16Gad19,192,43,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText18,NULL,
(APTR)&R16Gad18SInfo,18,NULL };
struct Gadget R16Gad17 = { &R16Gad18,192,54,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText17,NULL,
(APTR)&R16Gad17SInfo,17,NULL };
struct Gadget R16Gad16 = { &R16Gad17,192,65,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText16,NULL,
(APTR)&R16Gad16SInfo,16,NULL };
struct Gadget R16Gad15 = { &R16Gad16,192,76,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText15,NULL,
(APTR)&R16Gad15SInfo,15,NULL };
struct Gadget R16Gad14 = { &R16Gad15,192,87,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText14,NULL,
(APTR)&R16Gad14SInfo,14,NULL };
struct Gadget R16Gad13 = { &R16Gad14,192,98,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText13,NULL,
(APTR)&R16Gad13SInfo,13,NULL };
struct Gadget R16Gad12 = { &R16Gad13,192,109,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText29,NULL,
(APTR)&R16Gad12SInfo,12,NULL };
struct Gadget R16Gad11 = { &R16Gad12,192,120,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText28,NULL,
(APTR)&R16Gad11SInfo,11,NULL };
struct Gadget R16Gad10 = { &R16Gad11,36,120,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText10,NULL,
(APTR)&R16Gad10SInfo,10,NULL };
struct Gadget R16Gad9 = { &R16Gad10,36,109,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText9,NULL,
(APTR)&R16Gad9SInfo,9,NULL };
struct Gadget R16Gad8 = { &R16Gad9,36,98,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText8,NULL,
(APTR)&R16Gad8SInfo,8,NULL };
struct Gadget R16Gad7 = { &R16Gad8,36,87,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText7,NULL,
(APTR)&R16Gad7SInfo,7,NULL };
struct Gadget R16Gad6 = { &R16Gad7,36,76,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText6,NULL,
(APTR)&R16Gad6SInfo,6,NULL };
struct Gadget R16Gad5 = { &R16Gad6,36,65,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText5,NULL,
(APTR)&R16Gad5SInfo,5,NULL };
struct Gadget R16Gad4 = { &R16Gad5,36,54,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText4,NULL,
(APTR)&R16Gad4SInfo,4,NULL };
struct Gadget R16Gad3 = { &R16Gad4,36,43,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText3,NULL,
(APTR)&R16Gad3SInfo,3,NULL };
struct Gadget R16Gad2 = { &R16Gad3,36,32,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText2,NULL,
(APTR)&R16Gad2SInfo,2,NULL };
struct Gadget R16Gad1 = { &R16Gad2,36,21,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText1,NULL,
(APTR)&R16Gad1SInfo,1,NULL };
struct Gadget R20Gad24 = { NULL,192,21,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText24,NULL,
(APTR)&R20Gad24SInfo,24,NULL };
struct Gadget R20Gad23 = { &R20Gad24,192,32,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText23,NULL,
(APTR)&R20Gad23SInfo,23,NULL };
struct Gadget R20Gad22 = { &R20Gad23,192,43,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText22,NULL,
(APTR)&R20Gad22SInfo,22,NULL };
struct Gadget R20Gad21 = { &R20Gad22,192,54,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText21,NULL,
(APTR)&R20Gad21SInfo,21,NULL };
struct Gadget R20Gad20 = { &R20Gad21,192,65,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText20,NULL,
(APTR)&R20Gad20SInfo,20,NULL };
struct Gadget R20Gad19 = { &R20Gad20,192,76,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText19,NULL,
(APTR)&R20Gad19SInfo,19,NULL };
struct Gadget R20Gad18 = { &R20Gad19,192,87,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText18,NULL,
(APTR)&R20Gad18SInfo,18,NULL };
struct Gadget R20Gad17 = { &R20Gad18,192,98,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText17,NULL,
(APTR)&R20Gad17SInfo,17,NULL };
struct Gadget R20Gad16 = { &R20Gad17,192,109,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText16,NULL,
(APTR)&R20Gad16SInfo,16,NULL };
struct Gadget R20Gad15 = { &R20Gad16,192,120,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText15,NULL,
(APTR)&R20Gad15SInfo,15,NULL };
struct Gadget R20Gad14 = { &R20Gad15,192,131,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText14,NULL,
(APTR)&R20Gad14SInfo,14,NULL };
struct Gadget R20Gad13 = { &R20Gad14,192,142,82,8,NULL,
RELVERIFY,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText13,NULL,
(APTR)&R20Gad13SInfo,13,NULL };
struct Gadget R20Gad12 = { &R20Gad13,36,142,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText12,NULL,
(APTR)&R20Gad12SInfo,12,NULL };
struct Gadget R20Gad11 = { &R20Gad12,36,131,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText11,NULL,
(APTR)&R20Gad11SInfo,11,NULL };
struct Gadget R20Gad10 = { &R20Gad11,36,120,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText10,NULL,
(APTR)&R20Gad10SInfo,10,NULL };
struct Gadget R20Gad9 = { &R20Gad10,36,109,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText9,NULL,
(APTR)&R20Gad9SInfo,9,NULL };
struct Gadget R20Gad8 = { &R20Gad9,36,98,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText8,NULL,
(APTR)&R20Gad8SInfo,8,NULL };
struct Gadget R20Gad7 = { &R20Gad8,36,87,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText7,NULL,
(APTR)&R20Gad7SInfo,7,NULL };
struct Gadget R20Gad6 = { &R20Gad7,36,76,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText6,NULL,
(APTR)&R20Gad6SInfo,6,NULL };
struct Gadget R20Gad5 = { &R20Gad6,36,65,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText5,NULL,
(APTR)&R20Gad5SInfo,5,NULL };
struct Gadget R20Gad4 = { &R20Gad5,36,54,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText4,NULL,
(APTR)&R20Gad4SInfo,4,NULL };
struct Gadget R20Gad3 = { &R20Gad4,36,43,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText3,NULL,
(APTR)&R20Gad3SInfo,3,NULL };
struct Gadget R20Gad2 = { &R20Gad3,36,32,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText2,NULL,
(APTR)&R20Gad2SInfo,2,NULL };
struct Gadget R20Gad1 = { &R20Gad2,36,21,82,8,NULL,
RELVERIFY|STRINGRIGHT,STRGADGET|REQGADGET,
(APTR)&RBorder2a,NULL,&RIText1,NULL,
(APTR)&R20Gad1SInfo,1,NULL };
/* An RGadget4 keinen neuen Gadgets anhängen - oder Programm entsprechen
ändern.
*/
struct Gadget RGadget4 = { NULL,130,155,50,10,NULL,
RELVERIFY,BOOLGADGET|REQGADGET,
(APTR)&RBorder3a,NULL,&RIText31,NULL,
NULL,28,NULL };
struct Gadget RGadget3 = { &RGadget4,130,167,50,10,NULL,
RELVERIFY,BOOLGADGET|REQGADGET,
(APTR)&RBorder3a,NULL,&RIText30,NULL,
NULL,27,NULL };
struct Gadget RGadget2 = { &RGadget3,209,161,76,13,NULL,
RELVERIFY,BOOLGADGET|REQGADGET,
(APTR)&RBorder1a,NULL,&RIText26,NULL,
NULL,26,NULL };
struct Gadget RGadget1 = { &RGadget2,25,161,76,13,NULL,
RELVERIFY,BOOLGADGET|REQGADGET,
(APTR)&RBorder1a,NULL,&RIText25,NULL,
NULL,25,NULL };
struct Requester PinNameReq = { NULL,165,2,310,180,0,0,
&RGadget1,&PinNameBordera,&RIText27,
NOISYREQ,3,NULL,NULL,NULL };
/* CheckPinNames: Pinnamen überprüfen
Aufruf: result = CheckPinNames();
JedecGALType muß den GAL-Typ enthalten
Ergebnis: result = 0 : alles o.k.
sonst: entsprechende Fehlernummer
*/
int CheckPinNames()
{
UBYTE *ptr, *pinnames;
int numofpins, i, j, l, n;
if (JedecGALType == GAL16V8) {
numofpins = 20;
pinnames = PinNames16[0];
}
else {
numofpins = 24;
pinnames = PinNames20[0];
}
/*Pinnamen überprüfen*/
for (n=0; n<numofpins; n++) {
ptr = pinnames+n*10; /*überprüfen ob Pinname aus*/
if (*ptr == '/') /*gültigen Zeichen besteht*/
ptr++;
if (!*ptr) { /*kein Zeichen da?->Fehler*/
ReasmError(4,n+1);
return(4);
}
while (isalpha(*ptr) || isdigit(*ptr))
ptr++;
if (*ptr == '/') {
ReasmError(6,n+1);
return(6);
}
if (*ptr) {
ReasmError(3,n+1);
return(3);
}
for (l=0; l<n; l++) { /*Pinname doppelt?*/
if (strcmp(pinnames+l*10,(UBYTE *)"NC")) {
i = j = 0;
if (*(pinnames+l*10) == '/') i = 1;
if (*(pinnames+n*10) == '/') j = 1;
if (!strcmp(pinnames+l*10+i,pinnames+n*10+j)) {
ReasmError(2,n+1);
return(2);
}
}
}
/*GND an entsprechenden Pin?*/
if (!strcmp(pinnames+n*10,(UBYTE *)"GND")) {
if (n+1 != numofpins/2) {
ReasmError(5,n+1);
return(5);
}
}
if (n+1 == numofpins/2) {
if (strcmp(pinnames+n*10,(UBYTE *)"GND")) {
ReasmError(7,n+1);
return(5);
}
}
/*VCC an entsprechenden Pin?*/
if (!strcmp(pinnames+n*10,(UBYTE *)"VCC")) {
if (n+1 != numofpins) {
ReasmError(5,n+1);
return(5);
}
}
if (n+1 == numofpins) {
if (strcmp(pinnames+n*10,(UBYTE *)"VCC")) {
ReasmError(8,n+1);
return(5);
}
}
}
return(0);
}
/* PinNameRequster: Läßt Requester erscheinen, in dem die Pinnamen
für den Reassembler eingegeben werden können
Aufruf : result = PinNameRequester(galtype);
Parameter: galtype: GAL16V8 oder GAL20V8
Ergebnis : result = 0: Weiter angewählt
= 1: Abbruch angewählt oder Fehler
*/
int PinNameRequester(galtype)
int galtype;
{
struct IntuiMessage *imsg;
struct Gadget *gadget;
ULONG class;
USHORT code,gadID;
UBYTE *pinnames;
int n, numofpins;
char name[2];
if (galtype == GAL16V8) {
RGadget4.NextGadget = &R16Gad1;
pinnames = PinNames16[0];
numofpins = 20;
}
else {
RGadget4.NextGadget = &R20Gad1;
pinnames = PinNames20[0];
numofpins = 24;
}
if (Request(&PinNameReq,window)) {
for (n=0; n<5; n++) { /*Pin 1-Gadget aktivieren*/
if (JedecGALType == GAL16V8)
if (ActivateGadget(&R16Gad1,window,&PinNameReq))
break;
if (JedecGALType == GAL20V8)
if (ActivateGadget(&R20Gad1,window,&PinNameReq))
break;
}
for (;;) {
imsg = (struct IntuiMessage *) GetMsg(window->UserPort);
if (!imsg) WaitPort (window->UserPort);
else {
class = imsg->Class;
code = imsg->Code;
if (class==GADGETUP) {
gadget = (struct Gadget *)imsg->IAddress;
gadID=gadget->GadgetID;
}
ReplyMsg(imsg);
if (class == VANILLAKEY) {
if (code == 'w') { /*Weiter*/
if (!CheckPinNames()) {
EndRequest(&PinNameReq,window);
return(0);
}
}
if (code == 'a') { /*Abbruch*/
EndRequest(&PinNameReq,window);
return(1);
}
}
if (class == GADGETUP) {
if (gadID == 25) { /*Weiter*/
if (!CheckPinNames()) {
EndRequest(&PinNameReq,window);
return(0);
}
}
if (gadID == 26) { /*Abbruch*/
EndRequest(&PinNameReq,window);
return(1);
}
if (gadID == 27) { /*Set*/
name[0] = 'A';
name[1] = 0x00;
for (n=0; n<numofpins; n++) {
if (n+1 == numofpins/2) {
strcpy (pinnames+(long)(n*10),"GND");
continue;
}
if (n+1 == numofpins) {
strcpy (pinnames+(long)(n*10),"VCC");
continue;
}
strcpy (pinnames+(long)(n*10),name);
name[0]++;
}
if (galtype == GAL16V8)
RefreshGadgets(&R16Gad1,window,&PinNameReq);
else
RefreshGadgets(&R20Gad1,window,&PinNameReq);
}
if (gadID == 28) { /*Clear*/
for (n=0; n<numofpins; n++) {
if ((n+1 != numofpins) && (n+1 != numofpins/2))
*(pinnames+(long)(n*10)) = 0;
}
if (galtype == GAL16V8)
RefreshGadgets(&R16Gad1,window,&PinNameReq);
else
RefreshGadgets(&R20Gad1,window,&PinNameReq);
}
if ((gadID >= 1) && (gadID <=24)) {
gadget = gadget->NextGadget; /*Ende der Gadgetliste?*/
if (!gadget) /*dann von vorne beginnen*/
gadget = RGadget4.NextGadget;
for (n=0; n<5; n++) { /*nächstes Gadget aktivieren*/
if (ActivateGadget(gadget,window,&PinNameReq))
break;
}
}
}
}
}
}
}
/*RowActive: gibt an, ob eine Zeile aktiviert oder deaktiviert ist
Überprüft PT-Bit und sucht nach Folge A * /A
Aufruf: result = RowActive(row,colsize);
result = 0: Zeile ist deaktiviert
= 1: Zeile ist aktiviert
= 2: Zeile ist aktiviert, aber lauter 1en (VCC)
row: Zeile die überprüft werden soll
*/
int RowActive(row)
int row;
{
int n, colsize, flag;
if (JedecGALType == GAL16V8)
colsize = MAX_FUSE_ADR16+1;
else
colsize = MAX_FUSE_ADR20+1;
if (!Jedec.GALPT[row]) /*PT-Bit überprüfen*/
return(0);
flag = 0;
for (n=0; n<colsize; n++) { /*nach "A * /A" suchen*/
if (!Jedec.GALLogic[row*colsize+n]) {
flag = 1;
if (!(n % 2))
if (!Jedec.GALLogic[row*colsize+n+1])
return(0);
}
}
if (flag)
return(1);
else
return(2);
}
/*OLMCOutput: gibt an, ob OLMC als Ausgang programmiert ist
Aufruf: result = OLMCOutput(olmc);
olmc: die zu testende OLMC
mode: Modus, in dem sich das GAL befindet
Ergebnis: result = 0: kein Ausgang
= 1: Ausgang (enthält sinnvolle Gleichung)
*/
int OLMCOutput(olmc, mode)
int olmc, mode;
{
int n, flag;
if ((mode == 1) && (Jedec.GALAC1[olmc]))
return(0);
flag = 0;
for (n=0; n<8; n++) {
if (!n && ((mode == 2) || ((mode == 3) && Jedec.GALAC1[olmc]))) {
if (!RowActive(olmc*8)) /*Tristatefreigabe = GND?*/
return(0); /*ja, dann Eingang*/
}
else {
if (RowActive(olmc*8+n))
flag = 1;
}
}
return(flag);
}
/*MakeEquation: erstellt aus den angegebenen Zeilen der JEDEC-Struktur
die entsprechende Gleichung
Aufruf: result = MakeEquation(buff, olmc, colsize, mode, numofrows);
Ergebnis: result = 0: alles o.k.
= -1: Fehler, kein Speicher mehr
*/
int MakeEquation(buff, olmc, colsize, mode, rowoffset, numofrows)
struct ActBuffer *buff;
int olmc,colsize, mode, rowoffset, numofrows;
{
int ORflag, ANDflag, pin, m, n, result, numofchar;
struct ActBuffer startbuff;
startbuff = *buff; /*Zeiger merken*/
numofchar = 8;
n = rowoffset;
ORflag = 0;
while (n < numofrows) {
result = RowActive(olmc*8 + n);
if (result == 1) { /*enthält die Zeile etwas*/
if (ORflag) { /*Sinnvolles? ja, dann OR*/
if (AddString(buff," + "))
return(-1);
numofchar += 3; /*Zeichen mitzählen*/
}
ORflag = 1;
ANDflag = 0;
for (m=0; m<colsize; m++) {
if (!Jedec.GALLogic[(olmc*8+n)*colsize+m]) {
if (ANDflag) {
if (AddByte(buff,'*')) /*Produkterm auswerten*/
return(-1);
numofchar++;
}
ANDflag = 1;
if (JedecGALType == GAL16V8) { /*GAL16V8*/
if (mode == 1) /*Pinnummer aus der*/
pin = FuseToPin16Mode1[m/2]; /*Spaltennummer bes-*/
if (mode == 2) /*stimmen*/
pin = FuseToPin16Mode2[m/2];
if (mode == 3)
pin = FuseToPin16Mode3[m/2];
if (((PinNames16[pin-1][0] == '/') && !(m % 2)) || /*Negation in*/
((PinNames16[pin-1][0] != '/') && (m % 2))) { /*Pindek. be-*/
if (AddByte(buff,'/')) /*rücksichtigen*/
return(-1);
numofchar++;
}
if (PinNames16[pin-1][0] == '/') { /*Pinnamen ohne '/' schreiben*/
if (AddString(buff,&PinNames16[pin-1][1]))
return(-1);
}
else {
if (AddString(buff,PinNames16[pin-1]))
return(-1);
}
numofchar += (int)strlen(PinNames16[pin-1]);
}
if (JedecGALType == GAL20V8) { /*GAL20V8*/
if (mode == 1) /*Pinnummer aus der*/
pin = FuseToPin20Mode1[m/2]; /*Spaltennummer bes-*/
if (mode == 2) /*stimmen*/
pin = FuseToPin20Mode2[m/2];
if (mode == 3)
pin = FuseToPin20Mode3[m/2];
if (((PinNames20[pin-1][0] == '/') && !(m % 2)) || /*Negation in*/
((PinNames20[pin-1][0] != '/') && (m % 2))) { /*Pindek. be-*/
if (AddByte(buff,'/')) /*rücksichtigen*/
return(-1);
numofchar++;
}
if (PinNames20[pin-1][0] == '/') { /*Pinnamen ohne '/' schreiben*/
if (AddString(buff,&PinNames20[pin-1][1]))
return(-1);
}
else {
if (AddString(buff,&PinNames20[pin-1][0]))
return(-1);
}
numofchar += (int)strlen(&PinNames20[pin-1][0]);
}
if (numofchar > 60) { /*neue Zeile?*/
if (AddString(buff,"\n "))
return(-1);
numofchar = 8;
}
}
}
}
if (result == 2) { /*nur 1en in der Zeile, dann*/
*buff = startbuff; /*liegt VCC vor*/
if (AddString(buff,"VCC"))
return(-1);
break;
}
n++;
}
if (AddString(buff,"\n\n")) /*Gleichungsende*/
return(-1);
return(0);
}
/*Reasm: Erstellt aus der Jedec-Struktur wieder die Eingabe-Datei. Diese
wird in "buff" abelegt.
Aufruf: result = Reasm(buff);
buff: ActBuffer-Struktur für Speicher, in dem das File abgelegt
werden soll
Ergebnis: result = 0: alles o.k.
= sonst: Fehler
*/
int Reasm(buff)
struct ActBuffer buff;
{
int mode, n, numofpins, byte;
int olmc, colsize;
int tricon[8];
if (JedecGALType == GAL16V8) { /*GAL-Typ bestimmen*/
if (AddString(&buff,"GAL16V8\n"))
return(-1);
numofpins = 20;
colsize = MAX_FUSE_ADR16+1;
}
else {
if (AddString(&buff,"GAL20V8\n"))
return(-1);
numofpins = 24;
colsize = MAX_FUSE_ADR20+1;
}
byte = 0; /*Signatur erstellen*/
for (n=0; n<SIG_SIZE; n++) {
byte |= Jedec.GALSig[n]; /*8 Bits zu einem Byte*/
if (!((n+1)%8)) { /*zusammenfügen*/
if (!isprint(byte))
byte = '.';
if (AddByte(&buff,byte))
return(-1);
byte = 0;
}
byte <<= 1;
}
if (AddString(&buff,"\n\n"))
return(-1);
/*Pinnamen erstellen*/
for (n=1; n<=numofpins; n++) {
if (JedecGALType == GAL16V8)
if (AddString(&buff,&PinNames16[n-1][0]))
return(-1);
if (JedecGALType == GAL20V8)
if (AddString(&buff,PinNames20[n-1]))
return(-1);
if (n == numofpins/2) {
if (AddString(&buff,"\n"))
return(-1);
}
else {
if (AddString(&buff," "))
return(-1);
}
}
if (AddString(&buff,"\n\n"))
return(-1);
if (!Jedec.GALAC0 && !Jedec.GALSYN) { /*Modus überprüfen*/
ReasmError(1,0); /*Fehler, dann Ende*/
return(1);
}
/*Modus bestimmen*/
if (!Jedec.GALSYN) { /*Wenn SYN = 0, dann Mode 3*/
mode = 3; /*Register-Modus*/
}
else {
if (Jedec.GALSYN && Jedec.GALAC0)
mode = 2; /*Tristate-Modus*/
else
mode = 1; /*kombinatorische Ausgänge*/
}
for (n=0; n<8; tricon[n++]=0); /*Merker für Ausgänge mit Tristate-*/
/*kontrolle initialisieren*/
/*Gleichungen erstellen*/
for (olmc=0; olmc<8; olmc++) { /*8 OLMCs vorhanden*/
if (OLMCOutput(olmc,mode)) { /*OLMC als Ausgang?*/
if (JedecGALType == GAL16V8) {
/*Negation in Pindek. berücksichtigen*/
if (((PinNames16[19-olmc-1][0] == '/') && Jedec.GALXOR[olmc]) ||
((PinNames16[19-olmc-1][0] != '/') && !Jedec.GALXOR[olmc])) {
if (AddByte(&buff,'/'))
return(-1);
}
if (PinNames16[19-olmc-1][0] == '/') { /*Pinnamen ohne '/' schreiben*/
if (AddString(&buff,&PinNames16[19-olmc-1][1]))
return(-1);
}
else {
if (AddString(&buff,PinNames16[19-olmc-1]))
return(-1);
}
}
if (JedecGALType == GAL20V8) {
/*Negation in Pindek. berücksichtigen*/
if (((PinNames20[22-olmc-1][0] == '/') && Jedec.GALXOR[olmc]) ||
((PinNames20[22-olmc-1][0] != '/') && !Jedec.GALXOR[olmc])) {
if (AddByte(&buff,'/'))
return(-1);
}
if (PinNames20[22-olmc-1][0] == '/') { /*Pinnamen ohne '/' schreiben*/
if (AddString(&buff,&PinNames20[22-olmc-1][1]))
return(-1);
}
else {
if (AddString(&buff,PinNames20[22-olmc-1]))
return(-1);
}
}
if ((mode == 2) || ((mode == 3) && (Jedec.GALAC1[olmc]))) {
if (AddString(&buff,".T"))
return(-1);
tricon[olmc] = 1; /*Merker setzen, daß Tri.-*/
} /*kontrolle vorhanden ist*/
if ((mode == 3) && (!Jedec.GALAC1[olmc]))
if (AddString(&buff,".R"))
return(-1);
if (AddString(&buff," = "))
return(-1);
n = 0;
if ((mode == 2) || ((mode == 3) && Jedec.GALAC1[olmc])) /*bei Tri.*/
n++; /*die erste Zeile überspringen*/
if (MakeEquation(&buff, olmc, colsize, mode, n, 8))
return(-1);
}
}
/*Tristate-Kontrolle erzeugen*/
for (olmc=0; olmc<8; olmc++) {
if (tricon[olmc]) {
if (JedecGALType == GAL16V8) {
if (PinNames16[19-olmc-1][0] == '/') { /*Pinnamen ohne '/' schreiben*/
if (AddString(&buff,&PinNames16[19-olmc-1][1]))
return(-1);
}
else {
if (AddString(&buff,PinNames16[19-olmc-1]))
return(-1);
}
}
if (JedecGALType == GAL20V8) {
if (PinNames20[22-olmc-1][0] == '/') { /*Pinnamen ohne '/' schreiben*/
if (AddString(&buff,&PinNames20[22-olmc-1][1]))
return(-1);
}
else {
if (AddString(&buff,PinNames20[22-olmc-1]))
return(-1);
}
}
if (AddString(&buff,".E")) /*Tristate-Freigabe*/
return(-1);
if (AddString(&buff," = "))
return(-1);
if (MakeEquation(&buff, olmc, colsize, mode, 0, 1))
return(-1);
}
}
/*Abschlußtext schreiben*/
if (AddString(&buff,"DESCRIPTION:\nThis file is reassembled. Used JEDEC-File: '"))
return(-1);
if (AddString(&buff,&filename[0]))
return(-1);
if (AddString(&buff,"'\n\n"))
return(-1);
return(0); /*kein Fehler aufgetreten, fertig*/
}
/*Reassembler: Jedec-File in Source-File zurückverwandeln
*/
void Reassembler()
{
struct Buffer *reasm_buff;
struct ActBuffer mybuff;
struct FileHandle *fh;
UBYTE *filebuffer, *filebuffer2;
int result;
if (MyFileReq((char *)"load JEDEC file", (char *)".jed",YES)) {
if (!(GetJedec(&path[0]))) { /*JEDEC-File holen*/
if (PinNameRequester(JedecGALType))
return;
if (!(reasm_buff = (struct Buffer *)AllocMem((long)sizeof(struct Buffer),MEMF_PUBLIC|MEMF_CLEAR))) {
ErrorReq(2); /*kein Speicher mehr->Fehlermeldung*/
return;
}
mybuff.ThisBuff = reasm_buff;
mybuff.Entry = (UBYTE *)(&reasm_buff->Entries[0]);
mybuff.BuffEnd = (UBYTE *)reasm_buff + (long)sizeof(struct Buffer);
if (!Reasm(mybuff) && MyFileReq((char *)"save source file", (char *)".pld", YES)) {
PrintText((UBYTE *)"saving source file...",1);
if ((fh = Open(&path[0], MODE_NEWFILE))) {
for (;;) {
filebuffer = filebuffer2 = mybuff.Entry;
while (filebuffer2 < mybuff.BuffEnd) { /*Größe des Puffers bestimmen*/
if (!*filebuffer2)
break;
filebuffer2++;
}
/*Puffer schreiben*/
result = Write(fh, filebuffer, (long)(filebuffer2-filebuffer));
if (result == -1L) { /*Fehler beim Schreiben?*/
Close(fh); /*ja, dann Ende*/
FreeBuffer(reasm_buff);
PrintText((UBYTE *)" Error! ",0);
ErrorReq(13);
return;
}
if (!mybuff.ThisBuff->Next) /*noch ein Puffer da?*/
break; /*nein, dann for(;;)-Ende*/
mybuff.ThisBuff = mybuff.ThisBuff->Next;
mybuff.Entry = (UBYTE *)(&mybuff.ThisBuff->Entries[0]);
mybuff.BuffEnd = (UBYTE *)mybuff.ThisBuff + (long)sizeof(struct Buffer);
}
Close(fh);
}
else {
FreeBuffer(reasm_buff); /*Fehler?, dann Abbruch*/
PrintText((UBYTE *)" Error! ",0);
ErrorReq(13); /*Datei läßt sich nicht öffnen*/
return;
}
PrintText((UBYTE *)" o.k.",0);
}
FreeBuffer(reasm_buff); /*Speicher freigeben*/
}
}
}
/* gibt Fehlermeldungen des Reassemblers aus und gibt Speicher frei
*/
void ReasmError(errornum, pinnum)
int errornum, pinnum;
{
UBYTE *txtptr;
switch (errornum) {
case 1:
MyRequest(ERR_REQ,(UBYTE *)"Reassembler error!");
PrintText((UBYTE *)"Mode AC0 = SYN = 0 is not supported",1);
break;
case 2:
txtptr = (UBYTE *)"Pin xx: pinname defined twice";
sprintf(txtptr+4L,"%2d",pinnum);
*(txtptr+6L) = ':';
MyRequest(ERR_REQ,txtptr);
break;
case 3:
txtptr = (UBYTE *)"Pin xx: illegal character";
sprintf(txtptr+4L,"%2d",pinnum);
*(txtptr+6L) = ':';
MyRequest(ERR_REQ,txtptr);
break;
case 4:
txtptr = (UBYTE *)"Pin xx: no pinname found";
sprintf(txtptr+4L,"%2d",pinnum);
*(txtptr+6L) = ':';
MyRequest(ERR_REQ,txtptr);
break;
case 5:
txtptr = (UBYTE *)"Pin xx: VCC/GND at wrong pin";
sprintf(txtptr+4L,"%2d",pinnum);
*(txtptr+6L) = ':';
MyRequest(ERR_REQ,txtptr);
break;
case 6:
txtptr = (UBYTE *)"Pin xx: illegal use of '/'";
sprintf(txtptr+4L,"%2d",pinnum);
*(txtptr+6L) = ':';
MyRequest(ERR_REQ,txtptr);
break;
case 7:
txtptr = (UBYTE *)"Pin xx: GND expected";
sprintf(txtptr+4L,"%2d",pinnum);
*(txtptr+6L) = ':';
MyRequest(ERR_REQ,txtptr);
break;
case 8:
txtptr = (UBYTE *)"Pin xx: VCC expected";
sprintf(txtptr+4L,"%2d",pinnum);
*(txtptr+6L) = ':';
MyRequest(ERR_REQ,txtptr);
break;
}
}